/***************************************************************************//**
 * @file     csa37f7x_afe.h
 * @version  V1.0.0
 * @author   Chipsea MCU Group
 * @date     2020-10-21
 * @brief    该文件包含AFE各功能参数的定义和函数接口声明
 * 
 * @copyright Copyright (C) 2020 Chipsea Technologies Corp. All rights reserved.
 ****************************************************************************
 * @attention
 *  硬件平台: CSA37F70 评估板V1.0 \n
 *  SDK版本：  CSA37F7X_SDK_1.0.0
 * 
 * @par 修改日志:
 * <table>
 * <tr><th>Date        <th>Version  <th>Author              <th>Description
 * <tr><td>2020/10/21  <td>1.0.0    <td>Chipsea MCU Group  <td>创建初始版本
 * </table>
 *
 *****************************************************************************/

#ifndef __CSA37F7X_AFE_H__
#define __CSA37F7X_AFE_H__

// Include external header file.
#include "csa37f7x.h"

#ifdef __cplusplus
extern "C" {
#endif


/** @addtogroup AFE 模拟前端模块（AFE）
  CSA37FX71 包含 1 个 AFE 模块组(AFE0)。每个 AFE 模块包括两级 PGA，1 个 12 位 DAC，1 个14 位 ADC。
    - 14 位 SAR ADC，14 位精度保证，支持线性自校正
    - 18 路外部差分输入通道，或 36 路外部单端输入通道
    - 36 个模拟通道内部下拉电阻或上拉电阻多档位可配置，可以与外部单电阻传感器组成单桥
    - 内置温度传感器
    - 辅助压力通道，默认差分 200mV 信号产生，共模电压 VS/2
    - 支持内短接 VS/2、AGND
    - 支持传感器状态检测
    - 高达 1000KHz SPS
    - 支持 2 的补码/无符号格式的转换结果
    - ADC 4 种操作模式
    - 每个通道的转换结果存储在相应数据寄存器内，并带有有效标志
    - 内置 2 级 PGA
    - 内置 12 位 DAC 进行失调电压校准
    - 36 个模拟通道内部下拉电阻或上拉电阻多档位可配置，可以与外部单电阻传感器组成单桥
    - 可配置转换结束后产生系统从 Deepsleep1 进入 Deepsleep2 请求或是触发中断
  @{
*/


/**
 * @brief AFE ADC采样计数乘以ADC时钟周期
 */
typedef enum
{
    ADC_SAMPLE_CLK_17 = 0x00,   /*!<17*ADC Clock  */
    ADC_SAMPLE_CLK_33 = 0x01,   /*!<33*ADC Clock  */
    ADC_SAMPLE_CLK_65 = 0x02,   /*!<65*ADC Clock  */
    ADC_SAMPLE_CLK_129 = 0x03,  /*!<129*ADC Clock  */
    ADC_SAMPLE_CLK_257 = 0x04,  /*!<257*ADC Clock  */
    ADC_SAMPLE_CLK_513 = 0x05,  /*!<513*ADC Clock  */
    ADC_SAMPLE_CLK_1025 = 0x06, /*!<1025*ADC Clock  */
    ADC_SAMPLE_CLK_2049 = 0x07, /*!<2049*ADC Clock  */
} afe_adc_channel_sample_counter_t;

/**
 * @brief AFE ADC有效周期转换次数
 */
typedef enum
{
    ADC_CONVER_VALID_NUM_2 = 0x00,  /*!<有效转换周期次数2  */
    ADC_CONVER_VALID_NUM_4 = 0x01,  /*!<有效转换周期次数4  */
    ADC_CONVER_VALID_NUM_8 = 0x02,  /*!<有效转换周期次数8  */
    ADC_CONVER_VALID_NUM_16 = 0x03, /*!<有效转换周期次数16  */
    ADC_CONVER_VALID_NUM_32 = 0x04, /*!<有效转换周期次数32  */
    ADC_CONVER_VALID_NUM_64 = 0x05, /*!<有效转换周期次数64  */
    ADC_CONVER_VALID_NUM_128 = 0x06, /*!<有效转换周期次数128  */
    ADC_CONVER_VALID_NUM_256 = 0x07, /*!<有效转换周期次数256  */
   
} afe_adc_finite_period_trans_valid_num_t;

/**
 * @brief AFE ADC PGA1增益选择
 */
typedef enum
{
    AFE_PGA_1_GAIN_2 = 0x00,        /*!<PGA1增益为 2 */
    AFE_PGA_1_GAIN_16 = 0x01,       /*!<PGA1增益为 16 */
    AFE_PGA_1_GAIN_32 = 0x02,       /*!<PGA1增益为 32 */
    AFE_PGA_1_GAIN_64 = 0x03,       /*!<PGA1增益为 64 */
    AFE_PGA_1_GAIN_128 = 0x04,      /*!<PGA1增益为 128 */
} afe_pga_1_gain_t;

/**
 * @brief AFE ADC PGA2增益选择
 */
typedef enum
{
    AFE_PGA_2_GAIN_1 = 0x00,        /*!<PGA2增益为 1 */
    AFE_PGA_2_GAIN_8 = 0x07,        /*!<PGA2增益为 8 */
} afe_pga_2_gain_t;

/**
 * @brief AFE ADC通道建立时间选择
 */
typedef enum
{
    CHSU_10=0x00,   /*!<10us.  */
    CHSU_20=0x01,   /*!<20us.  */
    CHSU_40=0x02,   /*!<40us.  */
    CHSU_80=0x03,   /*!<80us.  */
} afe_adc_chsu_t;

/**
 * @brief AFE ADC有限周期扫描模式下A/D转化数据预处理方式选择
 */
typedef enum
{
    CAL_S_0=0x00,   /*!<直接进行平均处理  */
    CAL_S_1=0x01,   /*!<去掉最大值和最小值进行平均处理  */
} afe_adc_cal_s_t;

/**
 * @brief  ADC差分输入模式输出格式选择
 */
typedef enum
{
    AFE_OUTPUT_DATA_BIN = 0x00,                     /*!<格式为无符号数  */
    AFE_OUTPUT_DATA_COMPLEMENT_2 = 0x01,            /*!<格式为转换结果2的补码  */
} adc_sample_data_format_t;

/**
 * @brief ADC转换结束模式选择
 */
typedef enum
{
    AFE_TRANS_COMPLICATION_TO_DEEPSLEEP2 = 0x00,    /*!<AFE转换结束，置起中断  */
    AFE_TRANS_COMPLICATION_TO_INTERRUPT = 0x01,     /*!<AFE转换结束，进入深度睡眠2（仅在ADC时钟为14MHz有效）  */
} adc_trans_stop_mode_t;

/**
 * @brief ADC内部负端输入选择
 */
#ifdef __CSA37F70__
typedef enum
{
    AFE_INN_VS_2 = 0x00,                            /*!<负端接VS/2  */
    AFE_INN_GND = 0x01,                             /*!<负端接GND  */
    AEF_INN_TEMP = 0x02,							/*!<负端接内部温度传感器  */
} adc_inn_sel_t;
#else
typedef enum
{
    AFE_INN_VS_2 = 0x00,                            /*!<负端接VS/2  */
    AFE_INN_GND = 0x01,                             /*!<负端接GND  */
    AEF_INN_TEMP = 0x02,							/*!<负端接内部温度传感器  */
    AEF_INN_VDD_2 = 0x03,							/*!<负端接VDD/2  */
} adc_inn_sel_t;
#endif

/**
 * @brief AFE 低功耗模式控制
 */
typedef enum
{
    AFE_VCM_LOWPOWER = 0x00,                        /*!<低功耗模式  */
    AFE_VCM_FULLSPEED = 0x01,                       /*!<全速模式  */
} adc_vcm_cfg_t;

/**
* @brief 宏定义检查ADC有效周期转换次数
*/
#define AFE_VALID_NS_CHECK(value)  (((value) == ADC_CONVER_VALID_NUM_2) ||\
										((value) == ADC_CONVER_VALID_NUM_4)  ||\
										((value) == ADC_CONVER_VALID_NUM_8)  ||\
										((value) == ADC_CONVER_VALID_NUM_16) ||\
										((value) == ADC_CONVER_VALID_NUM_32) ||\
										((value) == ADC_CONVER_VALID_NUM_64) ||\
										((value) == ADC_CONVER_VALID_NUM_128)||\
										((value) == ADC_CONVER_VALID_NUM_256))
	
/**
* @brief 宏定义检查通道采样计数周期
*/	
#define AFE_CHSAMPCNT_CHECK(value) (((value) == ADC_SAMPLE_CLK_17)  ||\
										((value) == ADC_SAMPLE_CLK_33)	||\
										((value) == ADC_SAMPLE_CLK_65)	||\
										((value) == ADC_SAMPLE_CLK_129) ||\
										((value) == ADC_SAMPLE_CLK_257) ||\
										((value) == ADC_SAMPLE_CLK_513) ||\
										((value) == ADC_SAMPLE_CLK_1025)||\
										((value) == ADC_SAMPLE_CLK_2049))


/**
* @brief 宏定义检查通道建立时间选择
*/
#define	AFE_CHSU_CHECK(value) 		(((value) == CHSU_10)||\
									((value) == CHSU_20)||\
									((value) == CHSU_40)||\
									((value) == CHSU_80))

/**
* @brief 宏定义检查有限周期扫描模式下A/D转化数据预处理方式选择
*/
#define AFE_CAL_S_CHECK(value)		(((value) == CAL_S_0)||\
									((value) == CAL_S_1))

/**
* @brief 宏定义检查PGA1增益选择
*/
#define AFE_PGA1_GAIN_CHECK(value)		(((value) == AFE_PGA_1_GAIN_2)||\
										((value) == AFE_PGA_1_GAIN_16)||\
										((value) == AFE_PGA_1_GAIN_32)||\
										((value) == AFE_PGA_1_GAIN_64)||\
										((value) == AFE_PGA_1_GAIN_128))
/**
* @brief 宏定义检查PGA2增益选择
*/
#define AFE_PGA2_GAIN_CHECK(value)		(((value) == AFE_PGA_2_GAIN_1)||\
										((value) == AFE_PGA_2_GAIN_8))

/**
* @brief 定义AFE初始化结构体
*/
typedef struct
{
    adc_sample_data_format_t adc_sample_data_format;                            /*!<ADC差分输入模式输出格式选择 */
    afe_adc_channel_sample_counter_t adc_channel_sample_counter;                /*!<ADC采样计数 */
    afe_adc_finite_period_trans_valid_num_t adc_finite_period_trans_valid_num;  /*!<ADC有效周期转换次数 */
    adc_trans_stop_mode_t adc_trans_stop_mode;                                  /*!<ADC转换结束模式选择，1：AFE转换结束，进入深度睡眠2（仅在ADC时钟为14MHz有效）；0：AFE转换结束，置起中断 */
    afe_adc_chsu_t adc_chsu;                                                    /*!<ADC通道建立时间选择 */
    afe_adc_cal_s_t adc_cal_s;                                                  /*!<ADC有限周期扫描模式下A/D转化数据预处理方式选择 */
#ifdef __CSA37F70__
    enable_state_t afe_diff_input_enable_mode_ctrl;                             /*!<ADC工作模式使能选择，1：ADC选择伪差分工作模式；0：ADC选择差分工作模式 */
#else
	enable_state_t afe_ainp_pu;													/*!<ADC AINP端上拉电阻使能控制 */
	enable_state_t afe_ainp_pd;													/*!<ADC AINP端下拉电阻使能控制 */
#endif
    enable_state_t afe_inn_single;                                              /*!<ADC内部负端通道使能，1：使能内部负端输入通道；0：使能外部负端输入通道 */
    adc_inn_sel_t adc_inn_sel;                                                  /*!<ADC内部负端输入选择，1：GND；0：VS/2 */
    adc_vcm_cfg_t adc_vcm_cfg;                                                  /*!<ADC 低功耗模式控制，1：全速模式；0：低功耗模式 */
    afe_pga_1_gain_t afe_pga_1_gain;                                            /*!<ADC 配置PGA1 */
    afe_pga_2_gain_t afe_pga_2_gain;                                            /*!<ADC 配置PGA2 */
    enable_state_t afe_pga_enable_mode_ctrl;                                    /*!<ADC 使能PGA */

} afe_config_t;

/**
 * @brief AFE ADC转换状态定义
 */
typedef enum
{
    ADC_IDLE=0x01,              /*!<ADC初始状态 */
    ADC_START=0x02,             /*!<ADC开始转换阶段 */
    ADC_SAMPLE=0x03,            /*!<ADC采样阶段 */
    ADC_CONVER=0x04,            /*!<ADC转换阶段 */
    ADC_ADDR_WRITE=0x05,        /*!<ADC写ADDR寄存器阶段 */
    ADC_CONVER_CTRL=0x06,       /*!<ADC转换控制阶段 */
} afe_adc_conver_t;


/**
 * @brief AFE ADC转换操作模式定义
 */
typedef enum
{
    ADC_SINGLE_CONVER=0x00,             /*!<ADC单次转换 */
    ADC_SINGLE_CYCLE_SACAN=0x01,        /*!<ADC单周期扫描 */
    ADC_FINITE_PERIOD_SCAN_MODE_1=0x02, /*!<ADC有效周期扫描模式1 */
    ADC_BURST_MODE=0x03,                /*!<ADC突发模式， */
} afe_adc_operation_mode_t;

/**
 * @brief AFE ADC内部通道定义
 */
typedef enum
{
    INSEIDE_CHANNEL_VS_HALF=0x00,		/*!<ADC正端接内部VS/2 */
    INSEIDE_CHANNEL_AGND=0x01,			/*!<ADC正端接内部AGND */
    INSEIDE_SHORT_TEMPERATURE_0=0x02,	/*!<ADC正端接内部温度传感器 */
#ifndef __CSA37F70__
    INSEIDE_CHANNEL_VDD_2=0x03,         /*!<ADC 正端接内部 VDD/2*/
#endif
} afe_inside_channel_t;

/**
 * @brief AFE VS通道定义
 */
#ifdef __CSA37F70__
typedef enum
{
	VSnull=0x00,	/*!<VS输出控制仅打开VS0 */
	VS0=0x01,		/*!<VS输出控制仅打开VS0 */
	VS1=0x02,		/*!<VS输出控制仅打开VS1 */
	VS01=0x03,		/*!<VS输出控制VS0和VS1同时打开 */
	VS2=0x04,		/*!<VS输出控制仅打开VS2 */
	VS02=0x05,		/*!<VS输出控制VS0和VS2同时打开 */
	VS12=0x06,		/*!<VS输出控制VS1和VS2同时打开 */
	VS012=0x07		/*!<VS输出控制所以VS均打开 */
} vs_channel_t;
#else
typedef enum
{
	VSnull=0x00,	/*!<VS输出控制VS0/VS1全部关闭 */
	VS0=0x01,		/*!<VS输出控制仅打开VS0 */
	VS1=0x02,		/*!<VS输出控制仅打开VS1 */
	VS01=0x03,		/*!<VS输出控制VS0和VS1同时打开 */
} vs_channel_t;
#endif

/**
 * @brief AFE VS电压定义
 */
typedef enum
{
    VS20=0x00,	/*!<VS稳压输出2.0V */
    VS22=0x01,	/*!<VS稳压输出2.2V */
    VS26=0x02,	/*!<VS稳压输出2.6V */
    VS28=0x03,	/*!<VS稳压输出2.8V */
} afe_vs_value_t;


/**
 * @brief AFEbypass通道选择定义
 */
#ifdef	__CSA37F70__
typedef enum
{
    CHANNEL_AA_BP=0x00,		/*!<PGA1,PGA2均正常工作 */
    CHANNEL_PGA12_BP=0x01,	/*!<PGA1,PGA2均bypass */
    CHANNEL_PGA1_BP=0x02,	/*!<PGA1正常工作,PGA2bypass */
}afe_bypass_channel_t;
#else
typedef enum
{
    CHANNEL_AA_BP=0x00,		/*!<PGA1,PGA2均正常工作 */
    CHANNEL_PGA1_BP=0x01,	/*!<PGA1正常工作，PGA2bypass */
    CHANNEL_PGA12_BP=0x02,	/*!<PGA1，PGA2均bypass */
}afe_bypass_channel_t;
#endif
/**
 * @brief AFE 差分输出选择定义
 */
typedef enum
{
    DAC_DE_EN_P=0x00,		/*!<DAC只有P端输出 */
    DAC_DE_EN_PN=0x01,		/*!<DAC P端和N端均输出（默认） */
}afe_dac_diff_output_t;

/**
 * @brief AFE DAC VS电压选择定义
 */
typedef enum
{
    DAC_VRS_VS_DOUBLE=0x00,		/*!<DAC参考电压2倍VS（默认） */
    DAC_VRS_VS=0x01,			/*!<DAC参考电压VS */
}afe_dac_vs_value_t;

/**
 * @brief AFE ADC校准状态定义
 */
typedef enum
{
    ADC_CALIBRATION_IDLE=0x00,			/*!<ADC校准初始状态 */
    ADC_CALIBRATION_START_CAL=0x01,		/*!<ADC开始校准阶段 */
    ADC_CALIBRATION_COMP_SW=0x03,		/*!<ADC比较校准阶段 */
    ADC_CALIBRATION_RECEIVE=0x02,		/*!<ADC校准接收阶段 */
    ADC_CALIBRATION_CALCULATE=0x06,		/*!<ADC校准计算阶段 */
    
}afe_adc_calibration_status_t;

/**
 * @brief AFE 外部P和N通道定义
 */
typedef enum
{
    CHANNEL_AINNP_0=0,
    CHANNEL_AINNP_1=1,
    CHANNEL_AINNP_2=2,
    CHANNEL_AINNP_3=3,
    CHANNEL_AINNP_4=4,
    CHANNEL_AINNP_5=5,
    CHANNEL_AINNP_6=6,
    CHANNEL_AINNP_7=7,
    CHANNEL_AINNP_8=8,
    CHANNEL_AINNP_9=9,
    CHANNEL_AINNP_10=10,
    CHANNEL_AINNP_11=11,
    CHANNEL_AINNP_12=12,
    CHANNEL_AINNP_13=13,
    CHANNEL_AINNP_14=14,
    CHANNEL_AINNP_15=15,
    CHANNEL_AINNP_16=16,
    CHANNEL_AINNP_17=17,
    CHANNEL_AINNP_18=18,
    CHANNEL_AINNP_19=19,
    CHANNEL_AINNP_20=20,
    CHANNEL_AINNP_21=21,
    CHANNEL_AINNP_22=22,
    CHANNEL_AINNP_23=23,
    CHANNEL_AINNP_24=24,
    CHANNEL_AINNP_25=25,
    CHANNEL_AINNP_26=26,
    CHANNEL_AINNP_27=27,
    CHANNEL_AINNP_28=28,
    CHANNEL_AINNP_29=29,
    CHANNEL_AINNP_30=30,
    CHANNEL_AINNP_31=31,
    CHANNEL_AINNP_32=32,
    CHANNEL_AINNP_33=33,
    CHANNEL_AINNP_34=34,
    CHANNEL_AINNP_35=35,  
}afe_channel_ainnp_t;

/**
* @brief 宏定义检查ADC外部N和P通道配置
*/
#define AFE_AINNP_CHANNEL_CHECK(value) (((value) >= CHANNEL_AINNP_0) && ((value) <= CHANNEL_AINNP_35))


/**
* @brief 宏定义检查ADC转换状态
*/
#define AFE_ADC_CONVER_MODE_CHECK(value) 	(((value) == ADC_IDLE)||\
											((value) == ADC_START)||\
											((value) == ADC_SAMPLE)||\
											((value) == ADC_CONVER)||\
											((value) == ADC_ADDR_WRITE)||\
											((value) == ADC_CONVER_CTRL))

/**
* @brief 宏定义检查ADC转换操作模式
*/
#define AFE_ADC_OPREATION_MODE_CHECK(value)	(((value) == ADC_SINGLE_CONVER)||\
											((value) == ADC_SINGLE_CYCLE_SACAN)||\
											((value) == ADC_FINITE_PERIOD_SCAN_MODE_1)||\
											((value) == ADC_BURST_MODE))

/**
* @brief 宏定义检查ADC内部管脚配置
*/
#ifdef __CSA37F70__
#define AFE_INSIDE_CHANNEL_SET_CHECK(value)	(((value) == INSEIDE_CHANNEL_VS_HALF)||\
											((value) == INSEIDE_CHANNEL_AGND)||\
											((value) == INSEIDE_SHORT_TEMPERATURE_0))
#else
#define AFE_INSIDE_CHANNEL_SET_CHECK(value)	(((value) == INSEIDE_CHANNEL_VS_HALF)||\
											((value) == INSEIDE_CHANNEL_AGND)||\
											((value) == INSEIDE_SHORT_TEMPERATURE_0)||\
                                            ((value) == INSEIDE_CHANNEL_VDD_2))
#endif


/**
* @brief 宏定义检查ADC bypass通道
*/
#ifdef __CSA37F70__
#define AFE_BYPASS_CHANNEL_CHECK(value)	(((value) == CHANNEL_AA_BP)||\
											((value) == CHANNEL_PGA12_BP)||\
											((value) == CHANNEL_PGA1_BP)||\
											((value) == CHANNEL_AA_LOW))
#else
#define AFE_BYPASS_CHANNEL_CHECK(value)	(((value) == CHANNEL_AA_BP)||\
                                            ((value) == CHANNEL_PGA12_BP)||\
											((value) == CHANNEL_PGA1_BP))
#endif

/**
* @brief 宏定义检查DAC差分输出信号选择
*/
#define AFE_DAC_DIFF_OUTPUT_CHECK(value)	(((value) == DAC_DE_EN_P)||\
											((value) == DAC_DE_EN_PN))

/**
* @brief 宏定义检查DAC参考电压选择
*/
#define AFE_DAC_VS_CHECK(value)				(((value) == DAC_VRS_VS_DOUBLE)||\
											((value) == DAC_VRS_VS))

/**
* @brief 宏定义检查VS通道选择
*/
#ifdef __CSA37F70__
#define AFE_VS_CHANNEL_CHECK(value)			(((value) >= VSnull) && ((value) <= VS012))
#else
#define AFE_VS_CHANNEL_CHECK(value)			(((value) >= VSnull) && ((value) <= VS01))
#endif
/**
* @brief 宏定义检查VS参数选择
*/
	
#define AFE_VS_VALUE_CHECK(value)			(((value) == VS20)||\
											((value) == VS22)||\
											((value) == VS26)||\
											((value) == VS28))
/**
* @brief 宏定义检查ADC校准状态选择
*/
#define AFE_ADC_CALIBRATION_STATUS_CHECK(value)			(((value) == ADC_CALIBRATION_IDLE)||\
														((value) == ADC_CALIBRATION_START_CAL)||\
														((value) == ADC_CALIBRATION_COMP_SW)||\
														((value) == ADC_CALIBRATION_RECEIVE)||\
														((value) == ADC_CALIBRATION_CALCULATE))


/**
* @brief 定义采样通道0~20
*/
#define CHANNEL_0                0
#define CHANNEL_1                1
#define CHANNEL_2                2
#define CHANNEL_3                3
#define CHANNEL_4                4
#define CHANNEL_5                5
#define CHANNEL_6                6
#define CHANNEL_7                7
#define CHANNEL_8                8
#define CHANNEL_9                9
#define CHANNEL_10               10
#define CHANNEL_11               11
#define CHANNEL_12               12
#define CHANNEL_13               13
#define CHANNEL_14               14
#define CHANNEL_15               15
#define CHANNEL_16               16
#define CHANNEL_17               17
#define CHANNEL_18               18
#define CHANNEL_19               19
#define CHANNEL_20               20

/**
* @brief 宏定义检查ADC外部通道配置
*/
#define AFE_EXT_CHANNEL_CHECK(value) (((value) >= CHANNEL_0) && ((value) <= CHANNEL_20))

/**
* @brief 宏定义外部输入通道BIT位配置
*/
#define SAMPLE_CHANNEL_0                BIT(0)
#define SAMPLE_CHANNEL_1                BIT(1)
#define SAMPLE_CHANNEL_2                BIT(2)
#define SAMPLE_CHANNEL_3                BIT(3)
#define SAMPLE_CHANNEL_4                BIT(4)
#define SAMPLE_CHANNEL_5                BIT(5)
#define SAMPLE_CHANNEL_6                BIT(6)
#define SAMPLE_CHANNEL_7                BIT(7)
#define SAMPLE_CHANNEL_8                BIT(8)
#define SAMPLE_CHANNEL_9                BIT(9)
#define SAMPLE_CHANNEL_10               BIT(10)
#define SAMPLE_CHANNEL_11               BIT(11)
#define SAMPLE_CHANNEL_12               BIT(12)
#define SAMPLE_CHANNEL_13               BIT(13)
#define SAMPLE_CHANNEL_14               BIT(14)
#define SAMPLE_CHANNEL_15               BIT(15) 
#define SAMPLE_CHANNEL_16               BIT(16)
#define SAMPLE_CHANNEL_17               BIT(17)
#define SAMPLE_CHANNEL_18               BIT(18)
#define SAMPLE_CHANNEL_19               BIT(19)
#define SAMPLE_CHANNEL_20               BIT(20)

#define SAMPLE_CHANNEL_ALL              0x1fffff

/**
* @brief 宏定义检查ADC采样通道配置
*/
#define AFE_ADC_SAMPLE_CHANNEL_CHECK(value) (((value) == SAMPLE_CHANNEL_0)||\
											((value) == SAMPLE_CHANNEL_1)||\
											((value) == SAMPLE_CHANNEL_2)||\
											((value) == SAMPLE_CHANNEL_3)||\
											((value) == SAMPLE_CHANNEL_4)||\
											((value) == SAMPLE_CHANNEL_5)||\
											((value) == SAMPLE_CHANNEL_6)||\
											((value) == SAMPLE_CHANNEL_7)||\
											((value) == SAMPLE_CHANNEL_8)||\
											((value) == SAMPLE_CHANNEL_9)||\
											((value) == SAMPLE_CHANNEL_10)||\
											((value) == SAMPLE_CHANNEL_11)||\
											((value) == SAMPLE_CHANNEL_12)||\
											((value) == SAMPLE_CHANNEL_13)||\
											((value) == SAMPLE_CHANNEL_14)||\
											((value) == SAMPLE_CHANNEL_15)||\
											((value) == SAMPLE_CHANNEL_16)||\
											((value) == SAMPLE_CHANNEL_17)||\
											((value) == SAMPLE_CHANNEL_18)||\
											((value) == SAMPLE_CHANNEL_19))




/**@brief		    AFE ADC 转换结束
*
* @return		    返回ADC转换结束标志位
*/
uint8_t  afe_adc_conver_finish (void);

/**@brief		    AFE ADC 转换结束标志清除
*
* @return		    无
*/
void afe_adc_conver_finish_clear(void);

/**@brief 	        AFE功能初始化
 *
 * @param[in]  	    p_afe_config   输入AFE初始化结构体
 * @return  	    无
*/
void afe_init (afe_config_t *p_afe_config);

/**@brief 	        启动ADC转换函数
 *
 * @param  	        无
 * @return          无
*/
void afe_adc_conver_start (void);

/**@brief 	        ADC转换状态查询
 *
 * @param[in]       afe_adc_conver_mode     输入ADC转换状态
 *              
 * @return          1：表示当前ADC实际状态与查询状态匹配
 *				    0：表示当前ADC实际状态与查询状态不匹配		
*/
uint8_t afe_adc_conver_status_get (afe_adc_conver_t afe_adc_conver_mode);

/**@brief 	        ADC转换操作模式设置
 *
 * @param[in]  	    adc_conver_operation_mode   输入ADC转换操作模式
 * @return          无
*/
void afe_adc_opreation_mode_set (afe_adc_operation_mode_t adc_conver_operation_mode);

/**@brief		    ADC转换使能
 *
 * @return		    无
*/
void afe_adc_enable (void);

/**@brief		    ADC转换禁用
 *
 * @return		    无
*/
void afe_adc_disable (void);

/**@brief		    ADC中断使能
 *
 * @return		    无
*/
void afe_adc_interrupt_enable (void);

/**@brief		    ADC中断禁用
 *
 * @return		    无
*/
void afe_adc_interrupt_disable (void);

/**@brief		    ADC采样通道使能
 *
 * @param[in]	    sample_channel  输入采样通道：CHANNEL_0 至 CHANNEL_9,CHANNEL_18,CHANNEL_19,注：37FX71不支持CHANNEL_10~CHANNEL_17,CHANNEL_20配置
 * @return		    无
*/
void afe_sample_channel_enable (uint32_t sample_channel);


/**@brief		    ADC采样通道禁用
 *
 * @param[in]	    sample_channel  输入采样通道：CHANNEL_0 至 CHANNEL_9,CHANNEL_18,CHANNEL_19,注：37FX71不支持CHANNEL_10~CHANNEL_17,CHANNEL_20配置
 * @return		    无
*/
void afe_sample_channel_disble (uint32_t sample_channel);

/**@brief		    ADC采样通道使能状态查询
 *
 * @return		    返回ADC采样通道使能状态值
*/
uint32_t afe_sample_channel_enanle_state_get(void);

/**@brief		    ADC转换通道获取
 *
 * @return		    返回ADC转换通道值
*/
uint8_t  afe_adc_conver_channel_get (void);

/**@brief		    ADC内部通道设置
 *
 * @param[in]	    afe_inside_channel  输入ADC内部通道
 * @return		    无
*/
void  afe_inside_channel_set ( afe_inside_channel_t afe_inside_channel);

#ifdef __CSA37F70__
/**@brief		    ADC采样通道选择
 *
 * @param[in]	    sample_channel  ADC外部采样通道CHANNEL_0 至 CHANNEL_17
 * @param[in]	    sample_ainn     ADC外部N端通道CHANNEL_AINNP_0 至 CHANNEL_AINNP_35
 * @param[in]	    sample_ainp     ADC外部P端通道CHANNEL_AINNP_0 至 CHANNEL_AINNP_35
 * @return		    无
*/
#else
/**@brief		    ADC采样通道选择
 *
 * @param[in]	    sample_channel  ADC外部采样通道CHANNEL_0 至 CHANNEL_17
 * @param[in]	    sample_ainn     ADC外部N端通道CHANNEL_AINNP_0 至 CHANNEL_AINNP_19,注：37FX71不支持AIN20~AIN35配置
 * @param[in]	    sample_ainp     ADC外部P端通道CHANNEL_AINNP_0 至 CHANNEL_AINNP_19,注：37FX71不支持AIN20~AIN35配置
 * @return		    无
*/
#endif
void afe_sample_channel_select (uint32_t sample_channel,afe_channel_ainnp_t sample_ainn,afe_channel_ainnp_t sample_ainp);

#ifdef __CSA37F70__
/**@brief		    ADC外部采样通道值获取
 *
 * @param[in]	    afe_channel      ADC外部采样通道CHANNEL_0 至 CHANNEL_20
 * @return		    ADC采样值
*/
#else
/**@brief			ADC外部采样通道值获取
 *
 * @param[in]		afe_channel 	 ADC外部采样通道CHANNEL_0 至 CHANNEL_9,CHANNEL_18,CHANNEL_19,注：37FX71不支持CHANNEL_10~CHANNEL_17,CHANNEL_20配置
 * @return			ADC采样值
*/
#endif
uint32_t  afe_adc_sample_data_get (uint32_t afe_channel);


#ifdef __CSA37F70__
/**@brief		    ADC采样通道小数位值获取
 *
 * @param[in]	    afe_channel     ADC外部采样通道CHANNEL_0 至 CHANNEL_20
 * @return		    返回ADC采样通道小数位值
*/
#else
/**@brief		    ADC采样通道小数位值获取
 *
 * @param[in]	    afe_channel     ADC外部采样通道CHANNEL_0 至 CHANNEL_9,CHANNEL_18,CHANNEL_19,注：37FX71不支持CHANNEL_10~CHANNEL_17,CHANNEL_20配置
 * @return		    返回ADC采样通道小数位值
*/
#endif
uint32_t  afe_adc_sample_data_p_rslt_read (uint32_t afe_channel);

#ifdef __CSA37F70__
/**@brief		    ADC采样数据有效标志获取
 *
 * @param[in]	    afe_channel     ADC外部采样通道CHANNEL_0 至 CHANNEL_20
 * @return		    返回ADC采样数据有效标志
*/
#else
/**@brief		    ADC采样数据有效标志获取
 *
 * @param[in]	    afe_channel     ADC外部采样通道CHANNEL_0 至 CHANNEL_9,CHANNEL_18,CHANNEL_19,注：37FX71不支持CHANNEL_10~CHANNEL_17,CHANNEL_20配置
 * @return		    返回ADC采样数据有效标志
*/
#endif
uint8_t  afe_adc_sample_data_valid_flag_get (uint32_t afe_channel);

/**@brief		    ADC增益使能
 *
 * @return		    无
*/
void afe_pga_enable(void);

/**@brief		    ADC增益禁用
 *
 * @return		    无
*/
void afe_pga_disable(void);

/**@brief		    ADC增益bypass使能控制
 *
 * @param[in]	    afe_bypass_channel      增益bypass通道选择,注：bypass,相当于PGA增益为1
 * @param[in]	    state                   使能状态配置
 * @return		    无
*/
void afe_pga_bypass_set (afe_bypass_channel_t afe_bypass_channel,enable_state_t state);

/**@brief		    ADC温度传感器使能配置
 *
 * @return		    无
*/
void  afe_temprature_sensor_enable (void);

/**@brief		    ADC温度传感器禁用配置
 *
 * @return		    无
*/
void  afe_temprature_sensor_disable (void);

/**@brief		    AFE DAC使能配置
 *
 * @return		    无
*/
void  afe_dac_enable (void);

/**@brief		    AFE DAC禁用配置
 *
 * @return		    无
*/
void  afe_dac_disable (void);

/**@brief		    AFE DAC参数配置
 *
 * @param[in]	    dac_diff_output     DAC差分输出信号选择
 * @param[in]	    dac_vs_value        DAC参考电压选择
 * @return		    无
*/
void  afe_dac_config (afe_dac_diff_output_t dac_diff_output, afe_dac_vs_value_t dac_vs_value);


#ifdef __CSA37F70__
/**@brief		    AFE DAC数据获取
 *
 * @param[in]	    channel     采样通道CHANNEL_0 至 CHANNEL_19
 * @return		    无
*/
#else
/**@brief		    AFE DAC数据获取
 *
 * @param[in]	    channel     采样通道CHANNEL_0 至 CHANNEL_9,CHANNEL_18,CHANNEL_19，注：37FX71不支持CHANNEL_10~CHANNEL_17配置
 * @return		    无
*/
#endif
uint32_t afe_dac_data_get(uint32_t channel);

#ifdef __CSA37F70__
/**@brief		    AFE DAC数据配置
 *
 * @param[in]	    channel     采样通道CHANNEL_0 至 CHANNEL_19
 * @param[in]	    dac_data    输入配置DAC数据
 * @return		    无
*/
#else
/**@brief			AFE DAC数据配置
 *
 * @param[in]		channel 	采样通道CHANNEL_0 至 CHANNEL_9,CHANNEL_18,CHANNEL_19,注：37FX71不支持CHANNEL_10~CHANNEL_17配置
 * @param[in]		dac_data	输入配置DAC数据
 * @return			无
*/
#endif
void afe_dac_data_set(uint32_t channel,uint32_t dac_data);

/**@brief		    AFE VS使能配置
 *
 * @return		    无
*/
void  afe_vs_enable (void);

/**@brief		    AFE VS禁用配置
 *
 * @return		    无
*/
void  afe_vs_disable (void);

/**@brief		AFE VS限流控制，限流模式
 *
 * @return		无
*/
void  afe_vs_limit_enable (void);

/**@brief		AFE VS限流控制，正常模式
 *
 * @return		无
*/
void  afe_vs_limit_disable (void);

/**@brief		    AFE VS参数配置
 *
 * @param[in]	    vs_channel  VS通道
 * @param[in]	    vs_value    VS值
 * @return		    无
*/
void  afe_vs_config (vs_channel_t vs_channel,afe_vs_value_t vs_value);

	
#ifdef __CSA37F70__
	/**@brief			AFE ADC 采样通道的VS选择配置
	 *
	 * @param[in]		channel 	采样通道CHANNEL_0 至 CHANNEL_19
	 * @param[in]		vs_channel	VS选择
	 * @return			无
	*/
#else
	/**@brief			AFE ADC 采样通道的VS选择配置
	 *
	 * @param[in]		channel 	采样通道CHANNEL_0 至 CHANNEL_9,CHANNEL_18,CHANNEL_19,注：37FX71不支持CHANNEL_10~CHANNEL_17配置
	 * @param[in]		vs_channel	VS选择
	 * @return			无
	*/
#endif
void  afe_adc_channel_vs_select (uint32_t channel ,vs_channel_t vs_channel);

/**@brief		    AFE ADC 校准使能
*
* @return 	 	    无
*/
void  afe_adc_calibration_enable (void);

/**@brief		    AFE ADC 校准禁用
*
* @return		    无
*/
void  afe_adc_calibration_disable (void);

/**@brief		    AFE ADC 校准清除
*
* @return		    无
*/
void  afe_adc_calibration_clear (void);
		
/**@brief		    AFE ADC 校准状态查询
*
* @param[in]	    adc_calibration_status      校准状态参数
* @return		    1:   当前校准状态和查询值匹配
*				    0:   当前校准状态和查询值不匹配
*/
uint8_t afe_adc_calibration_status_get (afe_adc_calibration_status_t adc_calibration_status);


/**@brief		AFE ADC 校准有效标志获取
*
* @return		返回ADC校准有效标志位
*/
uint8_t afe_adc_calibration_valid_get (void);

/**@brief		    AFE ADC 校准结束
*
* @return		    返回ADC校准结束标志位
*/
uint8_t  afe_adc_calibration_finish (void);

/**@brief		    AFE ADC 校准清除
*
* @return		    无
*/
void  afe_adc_calibration_clear (void);

/**@brief		    ADC增益配置
 *
 * @param[in]	    pga1_gain       增益PAG1配置
 * @param[in]	    pga2_gain       增益PAG2配置
 * @return		    无
*/
void afe_pga_select(afe_pga_1_gain_t pga1_gain,afe_pga_2_gain_t pga2_gain);

#ifndef __CSA37F70__
/**@brief		    AINP端打开上拉电阻
 *
 * @return		    无
*/
void  afe_ainp_pullup_enable (void);

/**@brief		    AINP端关闭上拉电阻
 *
 * @return		    无
*/
void  afe_ainp_pullup_disable (void);

/**@brief		    AINP端打开下拉电阻
 *
 * @return		    无
*/
void  afe_ainp_pulldown_enable (void);

/**@brief		    AINP端关闭下拉电阻
 *
 * @return		    无
*/
void  afe_ainp_pulldown_disable (void);
#endif
/*@}*/ /* end of group AFE */

#ifdef __cplusplus
}
#endif

#endif  //__CSA37F7X_AFE_H__


/*** (C) COPYRIGHT 2020 Chipsea Technologies (Shenzhen) Corp. ***/

